#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "RingQueue.hpp"
#include "Task.hpp"
using namespace std;
// 生产者的生产方法
void *Productor(void *args)
{
    RingQueue<Task> *rq = static_cast<RingQueue<Task> *>(args);
    char ope[] = "+-*/%";
    while (true)
    {
        // 1.从某种渠道获取数据
        // int data = rand() % 10 + 1;
        int x = rand() %100;
        int y = rand() %100;
        char op = ope[rand()%strlen(ope)];
        Task t(x,y,op);
        // 2.将数据压入环形队列->生产
        rq->push(t);
        // std::cout << "productor done：" << data << std::endl;
        cout<<"productor done：生产的任务是："<<t.formatArg()<<"?"<<endl;
    }
}

// 消费者的消费方法
void *Consumer(void *args)
{
    RingQueue<Task> *rq = static_cast<RingQueue<Task> *>(args);
    while (true)
    {
        sleep(1);
        // 1.从环形队列获取数据
        // int data = 0;
         Task t;
         rq->pop(&t);
        // 2.获取数据之后，执行某种业务
        t();
        // std::cout << "consumer done：" << data << std::endl;
        cout<<"consumer done：,处理完成的任务是："<<t.formatArg()<<t.formatRes()<<endl;
    }
}

// 321原则
int main()
{
    srand(time(nullptr) ^ getpid());
    // 一个交易场所
    //RingQueue<int> rq; //??-->后续修改
    RingQueue<Task>* rq = new RingQueue<Task>();
    // 1.创建生产者和消费者线程 -->单生产者和单消费者模型
    //单生产者和单消费者变成多生产者和多消费者
    pthread_t p[2], c[3];
     for(int i = 0;i < 2;i++)
    pthread_create(p+i, nullptr, Productor, rq);
     for(int i = 0;i < 3;i++)
    pthread_create(c+i, nullptr, Consumer, rq);

    // 2.线程等待
     for(int i = 0;i < 2;i++)
     pthread_join(p[i], nullptr);
     for(int i = 0;i < 3;i++)
     pthread_join(c[i], nullptr);

    delete rq;
    return 0;
}